function datac_setcrosshair(axis_handle, tag, xu, yu, pos, callback, delta, type)
%
% datac_setcrosshair; given an axis and a named tag for the text window to
% display the measurements, set up for a crosshair callback for the axis.
%

% check the arguments.

global cross_pointer vmark_pointer % reference for the pointer bitmaps we need to generate (once)

if(nargin < 5)
    error('data_setcrosshair has insufficient arguments  in call');
end;
if(~ishandle(axis_handle))
    error('data_setcrosshair: axis_handle argument is not correct');
end;
if(~ischar(tag))
    error('data_setcrosshair: tag argument is bad');
end;
if(~ischar(xu))
    error('data_setcrosshair: xunit argument is bad');
end;
if(~ischar(yu))
    error('data_setcrosshair: yunit argument is bad');
end;
if(~isnumeric(pos) && length(pos) ~= 4)
    error('datac_setcrosshair: position for display field is bad');
end;
if(nargin > 6)
    if(~isnumeric(delta))
        error('datac_setcrosshair: delta flag must be numeric');
    end;
else
    delta = 0;
end;
if(nargin < 7)
    type = 'rectangle';
end;
switch(type)
    case {'rectangle', 'time_marker'}
    otherwise
        error('datac_setcrosshair: crosshair type not recognized');
end;

if(~exist('cross_pointer', 'var') || isempty(cross_pointer))
    o = NaN;
    cpointer = [ ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o 2 2 2 o o o o o o o, ...
        o o o o o 2 o o o 2 o o o o o o, ...
        1 1 1 1 1 2 o 1 o 2 1 1 1 1 1 o, ...
        o o o o o 2 o o o 2 o o o o o o, ...
        o o o o o o 2 2 2 o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o o o o o o o o o o ];

    cross_pointer=reshape(cpointer, 16, 16);

    vpointer = [ ...
        1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1, ...
        1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1, ...
        o 1 1 1 1 1 1 1 1 1 1 1 1 1 1 o, ...
        o o 1 1 1 1 1 1 1 1 1 1 1 1 o o, ...
        o o o 1 1 1 1 1 1 1 1 1 1 o o o, ...
        o o o o 1 1 1 1 1 1 1 1 o o o o, ...
        o o o o o 1 1 1 1 1 o o o o o o, ...
        o o o o o o 1 1 1 o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o, ...
        o o o o o o o 1 o o o o o o o o ];

    vmark_pointer=flipud(rot90(reshape(vpointer, 16, 16)));
end;


% safe to proceed:

htext = findobj('Tag', tag); % find/create the display window information
if(isempty(htext))
   if(delta)
      htext = uicontrol(...
      'units', 'normalized', ...
      'style', 'text', ...
      'Position', pos, ...
      'string', sprintf(' %7.2f  %s\n %7.2f  %s\n*%7.2f   %s\n*%7.2f    %s', 0, xu, 0, yu, 0, xu, 0, yu),  ...
      'Tag', tag );
   else
      htext = uicontrol(...
      'units', 'normalized', ...
      'style', 'text', ...
      'Position', pos, ...
      'string', sprintf('%7.1f  %s\n%7.1f  %s', 0, xu, 0, yu),  ...
      'Tag', tag );
   end;
else
%   set(htext, 'Visible', 'off');
end;

% build the axinfo structure.

axinfo.text_handle = htext;
axinfo.text_position = pos;
axinfo.delta_mode = 0;
axinfo.delta = [0, 0];
axinfo.line_handle = [];
axinfo.xunit = xu;
axinfo.yunit = yu;
axinfo.curpos = [0 0]; % current crosshair position (absolute in axis coordinates)
axinfo.down_pos = [0 0];
axinfo.up_pos = [0 0];
axinfo.select = 'normal';
axinfo.axislimits = [get(axis_handle, 'XLim'); get(axis_handle, 'Ylim')];
if(nargin > 5)
    axinfo.callback = callback;
end;
% store the structure.
if(~isempty(axis_handle))
   set(axis_handle, 'UserData', axinfo);
end;

return;
